# 私有属性和函数
#
# 在Python中，可以为属性和函数设置私有权限，即设置某个属性或函数不继承给子类。甚至，不能在类的外部调用和访问
# 设置私有权限的方法：在属性名和函数名 前面 加上两个下划线 __。
# 如果也想要别人去访问和修改私有属性，在Python中，
# get_xx用来获取私有属性，
# set_xx用来修改私有属性值。

# 执行顺序。就近原则，根据MRO这个顺序，先后找，找的顺序是递归的，从最里面开始找，也就是如下这个顺序，后面开始找，就近原则。
# MRO序列是: (<class '__main__.Dog'>, <class '__main__.Animal'>, <class 'object'>)
# abc
# 动物喊叫
# abc
# 生物
# 动物跑起来
class Animal(object):
    __name = '动物'  # 私有属性（类属性）

    def __init__(self, color):
        self.__color = color  # 私有属性

    def __run(self):  # 私有函数
        print(self.__name)  # 类的里面可以访问私有属性
        print('动物跑起来')

    def say(self):  # 普通函数
        print('动物喊叫')
        # self.__color = 'green'
        Animal.__name = '生物'
        print(self.__color)
        self.__run()

    def set_color(self, new_color):  # 通过提供一个set函数来修改私有属性
        self.__color = new_color

    def get_color(self):
        return self.__color

class Dog(Animal):
    pass

print(f'MRO序列是: {Dog.__mro__}')  # MRO顺序
# 执行顺序。就近原则，根据MRO这个顺序，先后找，找的顺序是递归的，从最里面开始找，也就是如下这个顺序，后面开始找，就近原则。
# MRO序列是: (<class '__main__.Dog'>, <class '__main__.Animal'>, <class 'object'>)

d = Dog('red')
d.set_color('abc')
print(d.get_color())
d.say()
# d.__name   # 报错
# Animal.__name  # 报错
# abc
# 动物喊叫
# abc
# 生物
# 动物跑起来